home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource4 / 203_01 / yam9.asm < prev    next >
Assembly Source File  |  1979-12-31  |  3KB  |  73 lines

  1. TITLE YAM9: CRC SUBS
  2. PAGE 50,132
  3. ;************************************************************************
  4. ;* CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20
  5. ;* 8086 Mnemonics
  6. ;*
  7. ;*          This subroutine will compute and check a true 16-bit
  8. ;*          Cyclic Redundancy Code for a message of arbitrary length.
  9. ;*
  10. ;*          The  use  of this scheme will guarantee detection of all
  11. ;*          single and double bit errors, all  errors  with  an  odd
  12. ;*          number  of  error bits, all burst errors of length 16 or
  13. ;*          less, 99.9969% of all 17-bit error bursts, and  99.9984%
  14. ;*          of  all  possible  longer  error bursts.  (Ref: Computer
  15. ;*          Networks, Andrew S.  Tanenbaum, Prentiss-Hall, 1981)
  16. ;*
  17. ;*
  18. ;************************************************************************
  19. ;*
  20. ;*          From: CRCSUB12.ASM
  21. ;*          Designed & coded by Paul Hansknecht, June 13, 1981
  22. ;*
  23. ;*          Copyright (c) 1981, Carpenter Associates
  24. ;*                                      Box 451
  25. ;*                                      Bloomfield Hills, MI 48013
  26. ;*                                      313/855-3074
  27. ;*
  28. ;*          This program may be freely reproduced for non-profit use.
  29. ;*
  30. ;************************************************************************
  31. ;
  32. ;           unsigned updcrc(char, oldcrc)
  33. ;
  34. ;           At start of packet, oldcrc is set to initial value
  35. ;                       oldcrc=0;
  36. ;
  37. ;           crc is accumulated by:
  38. ;                       oldcrc=updcrc(char, oldcrc);
  39. ;
  40. ;           at end of packet,
  41. ;                       oldcrc=updcrc(0,updcrc(0,oldcrc));
  42. ;                       send(oldcrc>>8); send(oldcrc);
  43. ;
  44. ;           on receive, the return value of updcrc is checked after the
  45. ;           last call (with the second CRC byte); 0 indicates no error detected
  46. ;
  47.  
  48. ; SMALL MODEL
  49. INCLUDE \LC\S\DOS.MAC
  50.         pseg
  51. public updcrc
  52.  
  53. updcrc:
  54.     push    bp        ; save frame pointer
  55.     mov    bp,sp        ; stack pointer to frame pointer
  56.     mov    ax,[bp+4]    ; get char
  57.     mov    bx,[bp+6]    ; get oldcrc
  58.     mov    cx,8        ; The generator is X^16 + X^12 + X^5 + 1       
  59. updloop:            ; as recommended by CCITT.             
  60.     rol    al,1        ; An alternate generator which is often    
  61.     rcl    bx,1        ; used in synchronous transmission protocols   
  62.     jnb    skipit        ; is X^16 + X^15 + X^2 + 1. This may be    
  63.                                 ; used by substituting XOR 8005H for
  64.     xor    bx,1021H    ; XOR 1021H in the adjacent code.
  65. skipit:
  66.     loop    updloop             
  67.     mov    ax,bx        ; mov to accumulator for return        
  68.     pop    bp        
  69.     ret            ; return with latest crc in ax
  70.  
  71.     endps
  72.     end
  73.